package demo.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author : GuoFei
 * @date : 2018/11/8 10:25
 */
public class JSONUtil {

    static JSONObject data = JSON.parseObject("{\"data\":[{\"comment\":\"我是2018-08-18 10:30:03\",\"time\":1534559403306},{\"comment\":\"我是2018-08-18 10:30:04\",\"time\":1534559404352},{\"comment\":\"我是2018-08-18 10:30:06\",\"time\":1534559406352},{\"comment\":\"我是2018-08-18 10:30:07\",\"time\":1534559407352},{\"comment\":\"我是2018-08-18 10:30:09\",\"time\":1534559409352},{\"comment\":\"我是2018-08-18 10:30:10\",\"time\":1534559410352},{\"comment\":\"我是2018-08-18 10:30:12\",\"time\":1534559412353},{\"comment\":\"我是2018-08-18 10:30:13\",\"time\":1534559413353},{\"comment\":\"我是2018-08-18 10:30:15\",\"time\":1534559415353},{\"comment\":\"我是2018-08-18 10:30:16\",\"time\":1534559416353},{\"comment\":\"我是2018-08-18 10:30:18\",\"time\":1534559418353},{\"comment\":\"我是2018-08-18 10:30:19\",\"time\":1534559419353},{\"comment\":\"我是2018-08-18 10:30:21\",\"time\":1534559421353},{\"comment\":\"我是2018-08-18 10:30:22\",\"time\":1534559422353},{\"comment\":\"我是2018-08-18 10:30:24\",\"time\":1534559424357},{\"comment\":\"我是2018-08-18 10:30:25\",\"time\":1534559425357},{\"comment\":\"我是2018-08-18 10:30:27\",\"time\":1534559427357},{\"comment\":\"我是2018-08-18 10:30:28\",\"time\":1534559428357},{\"comment\":\"我是2018-08-18 10:30:30\",\"time\":1534559430358},{\"comment\":\"我是2018-08-18 10:30:31\",\"time\":1534559431358}],\"beginTimer\":1534559400306,\"endTimer\":1534559433358}");

    public static void main(String[] args) {

////         1. 输出data的值
        String data = "[{\"e2\":{\"messageType\":2,\"desc\":\"sad\",\"pushType\":3}},{\"e1\":{\"messageType\":2,\"desc\":\"sdsdfad\",\"pushType\":3}},{\"efsd2\":{\"messageType\":4,\"desc\":\"safsd\",\"pushType\":5}}]\n";
        soutParseJson(data);

//        // 2. 生成JSON对象
//        MyJSON myJSON = new MyJSON();
//        JSONObject jsonObject = myJSON.myJSONObject(
//                myJSON.param(
//                        "userName", myJSON.myJSONObject(
//                                myJSON.param("pushType", 1),
//                                myJSON.param("messageType", 1),
//                                myJSON.param("desc", "用户姓名(text)")
//                                )
//                        ),
//                myJSON.param(
//                        "intoPlanImg", myJSON.myJSONObject(
//                                myJSON.param("pushType", 3),
//                                myJSON.param("messageType", 2),
//                                myJSON.param("desc", "进入计划图片(img)")
//                        )
//                )
//        );
//
//        soutParseJson(jsonObject.toJSONString());
//        System.out.println(jsonObject.toJSONString());

        // 3. 创建JSONArray
//        MyJSON myJSON = new MyJSON();
//        JSONArray jsonArray = myJSON.myJSONArray(
//                myJSON.myJSONObject(
//                        myJSON.param("name", "userName"),
//                        myJSON.param("desc", "用户姓名(text)"),
//                        myJSON.param("type", 1)
//                ),
//                myJSON.myJSONObject(
//                        myJSON.param("name", "intoPlanImg"),
//                        myJSON.param("desc", "进入计划图片(img)"),
//                        myJSON.param("type", 3)
//                )
//        );

//        System.out.println(jsonArray.toJSONString());
//        soutParseJson(jsonArray.toJSONString());

    }

    /**
     * 输出打印json字符串
     *
     * @param s json字符串
     */
    public static void soutParseJson(String s) {
        //json 字符串
        int level = 0;
        //存放格式化的json字符串
        StringBuffer jsonForMatStr = new StringBuffer();
        for (int index = 0; index < s.length(); index++)//将字符串中的字符逐个按行输出
        {
            //获取s中的每个字符
            char c = s.charAt(index);
//          System.out.println(s.charAt(index));

            //level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\t
            if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
                jsonForMatStr.append(getLevelStr(level));
//                System.out.println("123"+jsonForMatStr);
            }
            //遇到"{"和"["要增加空格和换行，遇到"}"和"]"要减少空格，以对应，遇到","要换行
            switch (c) {
                case '{':
                case '[':
                    jsonForMatStr.append(c + "\n");
                    level++;
                    break;
                case ',':
                    jsonForMatStr.append(c + "\n");
                    break;
                case '}':
                case ']':
                    jsonForMatStr.append("\n");
                    level--;
                    jsonForMatStr.append(getLevelStr(level));
                    jsonForMatStr.append(c);
                    break;
                default:
                    jsonForMatStr.append(c);
                    break;
            }
        }
        System.out.println(jsonForMatStr);

    }

    private static String getLevelStr(int level) {
        StringBuffer levelStr = new StringBuffer();
        for (int levelI = 0; levelI < level; levelI++) {
            levelStr.append("\t");
        }
        return levelStr.toString();
    }

    @NoArgsConstructor
    private static class MyJSON {

        private JSONArray myJSONArray(JSONObject... jsonObjects) {
            JSONArray jsonArray = new JSONArray();
            jsonArray.addAll(Arrays.asList(jsonObjects));
            return jsonArray;
        }

        private JSONObject myJSONObject(JSONObject... jsonObjects) {
            JSONObject jo = new JSONObject();
            JSONObject temp;
            for (Object o : jsonObjects) {
                temp = (JSONObject) o;
                jo.put(temp.getString("k"), temp.get("v"));
            }
            return jo;
        }

        private JSONObject param(String k, Object v) {
            JSONObject jo = new JSONObject();
            jo.put("k", k);
            jo.put("v", v);
            return jo;
        }

    }
}
